/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.smart.service.infohotel;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.ElementNotFoundException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.smart.service.util.Logging;
import com.smart.service.util.UtilDate;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Example form info room hotel
 * 
 * <form action="https://ssl.hoteis.com/bookingInitialise.do" method="post"
 * id="roomInfoForm_0" name="roomAvailabilityform_96445_0"> <input
 * id="jsEnabled" name="jsEnabled" type="hidden" value="false" /> <input
 * name="destination" type="hidden" value="Madonna di Campiglio" /> <input
 * name="destinationIntId" type="hidden" value="1636635" /> <input
 * name="countryCode" type="hidden" value="BR" /> <input name="stateProvince"
 * type="hidden" value="" /> <input name="arrivalDate" type="hidden"
 * value="28/07/2011" /> <input name="departureDate" type="hidden"
 * value="29/07/2011" /> <input name="supplierType" type="hidden" value="V" />
 * <input name="supplierName" type="hidden" value="VENERE" /> <input
 * name="supplierId" type="hidden" value="14" /> <input
 * name="supplierPropertyId" type="hidden" value="1258" /> <input
 * name="propertyType" type="hidden" value="" /> <input name="hotelId"
 * type="hidden" value="279818" /> <input name="hotelName" type="hidden"
 * value="Savoia Palace" /> <input name="hotelAddress1" type="hidden"
 * value="Viale Dolomiti di Brenta 18" /> <input name="hotelAddress2"
 * type="hidden" value="Madonna di Campiglio" /> <input name="hotelCity"
 * type="hidden" value="Pinzolo" /> <input name="hotelCityId" type="hidden"
 * value="1636635" /> <input name="hotelPostCode" type="hidden" value="38084" />
 * <input name="hotelCountry" type="hidden" value="IT" /> <input
 * name="hotelInformation" type="hidden" value="" /> <input name="checkInPolicy"
 * type="hidden" value=
 * "Pessoas extras podem incorrer em taxas adicionais que variam dependendo da política do hotel.&lt;br /&gt;Os hóspedes devem apresentar identidade oficial válida na hora do check-in. &lt;br /&gt;Identificação com foto, o número do cartão de crédito ou depósito em dinheiro são necessários na hora do check-in para despesas ocasionais.&lt;br /&gt; Pedidos especiais estão sujeitos a disponibilidade ao fazer o check-in e podem incorrer em taxas adicionais. Tais pedidos não podem ser garantidos.&lt;br /&gt;Os seguintes cartões de crédito são aceitos por este hotel para custos adicionais ocorridos na estadia dos hóspedes."
 * /> <input name="hotelPolicyText" type="hidden" value=
 * "Pessoas extras podem incorrer em taxas adicionais que variam dependendo da política do hotel.&lt;br /&gt;Os hóspedes devem apresentar identidade oficial válida na hora do check-in. &lt;br /&gt;Identificação com foto, o número do cartão de crédito ou depósito em dinheiro são necessários na hora do check-in para despesas ocasionais.&lt;br /&gt; Pedidos especiais estão sujeitos a disponibilidade ao fazer o check-in e podem incorrer em taxas adicionais. Tais pedidos não podem ser garantidos.&lt;br /&gt;Os seguintes cartões de crédito são aceitos por este hotel para custos adicionais ocorridos na estadia dos hóspedes."
 * /> <input name="hotelCancellationPolicy" type="hidden" value=
 * "O Hoteis.com não cobra qualquer taxa de cancelamento ou alteração. Além disso, este hotel não cobrará qualquer taxa de cancelamento para esta reserva.  "
 * /> <input name="bedTypes" type="hidden" value="" /> <input
 * name="hotelDrivingInstructions" type="hidden" value="" /> <input
 * name="psrcValue" type="hidden" value="" /> <input type="hidden"
 * name="numberOfRoomType" value="1 of 4" /> <input type="hidden"
 * name="minPrice" value="c..BsZeCKa6s74W5zGPnxRfigZeXPkF7xiL" /> <input
 * type="hidden" name="displayedCurrentPrice"
 * value="c..BsZeCKa6s74W5zGPnxRfigZeXPkF7xiL" /> <input name="hotelImageURL"
 * type="hidden" value=
 * "http://cls.cdn-hotels.com/hotels/3000000/2530000/2522000/2521929/2521929_21_t.jpg"
 * /> <input name="hotelStarRating" type="hidden" value="4.0" /> <input
 * name="hotelLatitude" type="hidden" value="46.229732" /> <input
 * name="hotelLongitude" type="hidden" value="10.826574" /> <input
 * name="displayNightlyRates" type="hidden" value="c..dmzEtQLMQDw." /> <input
 * name="nativeNightlyRates" type="hidden" value="c..Xf1nwLARfoo." /> <input
 * name="roomCount" type="hidden" value="4" /> <input
 * name="propertyDetailsDisplayRoomRates.currencyCode" type="hidden" value="BRL"
 * /> <input name="propertyDetailsDisplayRoomRates.roomRate" type="hidden"
 * value="c..dmzEtQLMQDw." /> <input name="nativeCurrencyCode" type="hidden"
 * value="EUR" /> <input name="nativeRoomRate" type="hidden"
 * value="c..Xf1nwLARfoo." /> <input name="chargeableRoomRateTotal"
 * type="hidden" value="c..Xf1nwLARfoo." /> <input
 * name="chargeableRoomRateTaxesAndFees" type="hidden" value="c..c8jWdDsu_c4."
 * /> <input name="rateFrequency" type="hidden" value="" /> <input
 * name="rateCode" type="hidden" value="488" /> <input name="numberOfNights"
 * type="hidden" value="1" /> <input name="roomTypeCode" type="hidden"
 * value="96445" /> <input name="smokingPreferences" type="hidden" value="" />
 * <input name="roomTypeName" type="hidden" value="Single Room - Half Board" />
 * <input type="hidden" name="depositRequired" value="false" /> <input
 * name="numberOfRooms" type="hidden" value="1" /> <input name="numberOfAdults"
 * type="hidden" value="1" /> <input name="numberOfChildren" type="hidden"
 * value="0" /> <div class="room_info"> <div class="price_and_book_block"> <div
 * class="price_info_and_special_price"> <span class="price_info">preço médio da
 * diária</span> <span class="price">R$185</span> <div> <span
 * class="price_match">Garantia de equiparação de preços</span> <span
 * class="icon_tooltip" title=
 * "Garantia de equiparação de preços para reservas em todos os hotéis dentro do prazo de cancelamento de reserva de cada hotel. Caso encontre um preço mais baixo exatamente para o mesmo local (até 24 horas após sua reserva conosco), nós vamos cobri-lo ou permitir que você cancele sua reserva sem penalidade."
 * ></span> </div></div> <div class="buttonBorder1"> <div class="buttonBorder2">
 * <button id="btn_book_now_0" type="submit">Reservar</button>
 * </div></div></div> <strong id="room_type_name_0">Single Room - Half
 * Board</strong> <span>Single Room - Half Board</span> <span
 * class="tfn_hotel_info"> Informações sobre o hotel: <span
 * class="hd_room_info_tfn" id="hd_room_info_tfn_0">0800-891-3841</span></span>
 * <span class="venere_payment_info">O pagamento será feito no hotel ao fazer o
 * check-out a não ser que o plano de pagamento contenha PRÉ-PAGO/SEM
 * REEMBOLSO</span> </div> </form>
 * 
 * @author arthur
 */
public class InfoWebHotelService {
	/** A Constant LOGGER. */
	private static final Logging LOGGER = Logging
			.getLogger(InfoWebHotelService.class.getName());
	private final WebClient webClient = new WebClient(
			BrowserVersion.INTERNET_EXPLORER_6);
	private static final String page_url = "http://www.hoteis.com";
	// room
	public static final String _roomTypeName = "roomTypeName";
	public static final String _roomTypeCode = "roomTypeCode";
	public static final String _preco = "Preco";
	public static final String _descricao = "Descricao";
	public static final String _hotelImageURL = "hotelImageURL";
	public static final String _info = "Info";
	public static final String _detalhes = "Detalhes";
	public static final String _numberOfAdults = "numberOfAdults";
	public static final String _numberOfChildren = "numberOfChildren";
	// hotel
	public static final String _hotelAddress1 = "hotelAddress1";
	public static final String _hotelAddress2 = "hotelAddress2";
	public static final String _hotelCity = "hotelCity";
	public static final String _hotelPostCode = "hotelPostCode";
	public static final String _hotelLatitude = "hotelLatitude";
	public static final String _hotelLongitude = "hotelLongitude";
	public static final String _hotelStarRating = "hotelStarRating";
	public static final String _hotelId = "hotelId";

	public static final String _hotelCancellationPolicy = "hotelCancellationPolicy";
	public static final String _checkInPolicy = "checkInPolicy";
	public static final String _hotelPolicyText = "hotelPolicyText";
	public static final String _hotelInformation = "hotelInformation";

	private HtmlPage pageHotel(String lnk) {
		LOGGER.debug("pageHotel " + lnk);
		HtmlPage page1 = null;
		try {
			page1 = webClient.getPage(lnk);
			// id=shortedContent
		} catch (Exception e) {
			System.out.println("ERROR " + lnk);
			e.printStackTrace();
		}
		return page1;
	}

	/**
	 * fix date in link
	 * 
	 * @param link
	 * @param i
	 * @return
	 */
	private String createLink(String link, int i) {
		long dia = 24 * 60 * 60 * 1000;
		String lnk = page_url
				+ link.replaceAll(
						"departureDate=\\d\\d-\\d\\d-\\d\\d\\d\\d",
						"departureDate="
								+ UtilDate.formatDate2(new Date(System
										.currentTimeMillis()
										+ (i * dia)
										+ (3 * dia)))).replaceAll(
						"arrivalDate=\\d\\d-\\d\\d-\\d\\d\\d\\d",
						"arrivalDate="
								+ UtilDate.formatDate2(new Date(System
										.currentTimeMillis() + i * dia)));
		return lnk;
	}

	/**
	 * 
	 * @param page1
	 * @return
	 */
	public List<String> imagensHotel(HtmlPage page1) {
		final List<?> links = page1
				.getByXPath("//a[@class='thumbnail_image_link']");
		List<String> imagens = new ArrayList<String>();
		for (Object object : links) {
			HtmlAnchor a = (HtmlAnchor) object;
			imagens.add(a.getHrefAttribute());
		}
		return imagens;

	}

	private List<Map<String, String>> roomsHotel(Map<String, String> hotel,
			HtmlPage page1) {
		final List<?> rooms = page1.getByXPath("//div[@class='room_info']");
		List<Map<String, String>> listRooms = null;
		if(rooms.size() != 0){
			listRooms = createListRooms1(hotel, page1, rooms);	
		}else{
			listRooms = createListRooms2(hotel, page1, page1.getForms());
		}
		return listRooms;

	}

	private List<Map<String, String>> createListRooms1(
			Map<String, String> hotel, HtmlPage page1, final List<?> rooms) {
		List<Map<String, String>> listRooms = new ArrayList<Map<String, String>>();
		for (int i = 0; i < rooms.size(); i++) {
			HtmlElement ele = page1.getElementById("roomInfoForm_" + i);
			if (ele instanceof HtmlForm) {
				HtmlForm form = (HtmlForm) ele;
				addInfoHotel(hotel, form);
				Map<String, String> room = createMapRoom(i, form);
				listRooms.add(room);
			}
		}
		assert rooms.size() == listRooms.size() : "rooms size != listRooms size";
		return listRooms;
	}
	
	private List<Map<String, String>> createListRooms2(
			Map<String, String> hotel, HtmlPage page1, final List<HtmlForm> rooms) {
		List<Map<String, String>> listRooms = new ArrayList<Map<String, String>>();
		int i = 0;
		for (HtmlForm htmlForm : rooms) {
			if(htmlForm.getId().startsWith("roomInfoForm_")){
				addInfoHotel(hotel, htmlForm);
				Map<String, String> room = createMapRoom(i, htmlForm);
				listRooms.add(room);
				++i;
			}
		}
		assert i == listRooms.size() : i + " !=" + listRooms.size();
		return listRooms;
	}

	private Map<String, String> createMapRoom(int i, HtmlForm form) {
		Map<String, String> room = new HashMap<String, String>();
		addInfoRoomName(form, room);
		addInfoRoomCode(form, room, i);
		addInfoRoomPrice(room);
		addInfoRoomDescription(i, form, room);
		addInfoRoomImage(form, room);
		addInfoRoomInfo(form, room);
		addInfoRoomDetails(form, room);
		addInfoRoomNumberOfChildren(form, room);
		addInfoRoomNumberOfAdults(form, room);
		return room;
	}

	private void addInfoRoomNumberOfAdults(HtmlForm form,
			Map<String, String> room) {
		try {
			room.put(_numberOfAdults, form.getInputByName(_numberOfAdults)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			room.put(_numberOfAdults, "2");
		}
	}

	private void addInfoRoomNumberOfChildren(HtmlForm form,
			Map<String, String> room) {
		try {
			room.put(_numberOfChildren, form.getInputByName(_numberOfChildren)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			room.put(_numberOfChildren, "4");
		}
	}

	private void addInfoRoomPrice(Map<String, String> room) {
		// <span class="simple_price">R$270</span>
		room.put(_preco, "270");
	}

	/**
	 * 
	 * 
	 * @param form
	 * @param room
	 */

	private void addInfoRoomDetails(HtmlForm form, Map<String, String> room) {
		StringBuffer sb = new StringBuffer();
		try {
			addInfoRoomInformation(form, sb);
			addInfoRoomCheckInPolicy(form, sb);
			addInfoRoomCancellationPolicy(form, sb);
		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			sb.append("no details");
		}
		room.put(_detalhes, sb.toString());
	}

	/**
	 * <input name="hotelCancellationPolicy" type="hidden" value= "O Hoteis.com
	 * não cobra qualquer taxa de cancelamento ou alteração. Além disso, este
	 * hotel não cobrará qualquer taxa de cancelamento para esta reserva. " />
	 * 
	 * @param form
	 * @param sb
	 */
	private void addInfoRoomCancellationPolicy(HtmlForm form, StringBuffer sb) {
		sb.append(" ").append(_hotelCancellationPolicy).append(" ");
		String canPolicy = form.getInputByName(_hotelCancellationPolicy)
				.getValueAttribute();
		sb.append(" ")
				.append(canPolicy.replaceAll("Hoteis.com", "TravelSmart"));
	}

	/**
	 * <input name="checkInPolicy" type="hidden" value= "Pessoas extras podem
	 * incorrer em taxas adicionais que variam dependendo da política do
	 * hotel.&lt;br /&gt; Os hóspedes devem apresentar identidade oficial válida
	 * na hora do check-in. &lt;br /&gt;Identificação com foto, o número do
	 * cartão de crédito ou depósito em dinheiro são necessários na hora do
	 * check-in para despesas ocasionais.&lt;br /&gt; Pedidos especiais estão
	 * sujeitos a disponibilidade ao fazer o check-in e podem incorrer em taxas
	 * adicionais. Tais pedidos não podem ser garantidos.&lt;br /&gt;Os
	 * seguintes cartões de crédito são aceitos por este hotel para custos
	 * adicionais ocorridos na estadia dos hóspedes." />
	 * 
	 * @param form
	 * @param sb
	 */
	private void addInfoRoomCheckInPolicy(HtmlForm form, StringBuffer sb) {
		sb.append(" ").append(_checkInPolicy).append(" ");
		sb.append(" ").append(
				form.getInputByName(_checkInPolicy).getValueAttribute());
	}

	/**
	 * <input name="hotelInformation" type="hidden" value="" />
	 * 
	 * @param form
	 * @param sb
	 */
	private void addInfoRoomInformation(HtmlForm form, StringBuffer sb) {
		sb.append(" ").append(_hotelInformation).append(" ");
		sb.append(" ").append(
				form.getInputByName(_hotelInformation).getValueAttribute());
	}
	
	/**
	 * 
	 * @param form
	 * @param room
	 */
	private void addInfoRoomInfo(HtmlForm form, Map<String, String> room) {
		try {
			room.put(_info, form.getInputByName("mealPlan").getValueAttribute());
		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			room.put(_info, "");
		}
	}

	/**
	 * <input name="roomTypeCode" type="hidden" value="96445" />
	 * 
	 * @param form
	 * @param room
	 * @param i
	 */
	private void addInfoRoomCode(HtmlForm form, Map<String, String> room, int i) {
		try {
			room.put(_roomTypeCode, form.getInputByName(_roomTypeCode)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			room.put(_roomTypeCode, form.getInputByName(_hotelId)
					.getValueAttribute() + i);
		}
	}

	/**
	 * <input name="roomTypeName" type="hidden" value="Single Room - Half Board"
	 * />
	 * 
	 * @param form
	 * @param room
	 */
	private void addInfoRoomName(HtmlForm form, Map<String, String> room) {
		try {
			room.put(_roomTypeName, form.getInputByName(_roomTypeName)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			room.put(_roomTypeName, "Sem nome");
		}
	}

	/**
	 * <p id="room_description_0">
	 * City view. Separate sitting area. In-room safe (accommodates laptop).
	 * Wireless high-speed Internet access (surcharge). Wired high-speed
	 * Internet access (surcharge). Satellite television service. Television.
	 * Direct-dial phone. Minibar. Kitchenette. Cookware, dishware, and
	 * utensils. Kitchen linens (dishtowels, sponges, etc). Bathroom phone.
	 * Complimentary toiletries. Remote lighting/drapery/curtain control.
	 * Blackout drapes/curtains. Microwave (on request). Iron/ironing board (on
	 * request). Air conditioning. Window opens.
	 * </p>
	 * 
	 * @param i
	 * @param form
	 * @param room
	 */
	private void addInfoRoomDescription(int i, HtmlForm form,
			Map<String, String> room) {
		try {
			HtmlElement desc = form.getElementById("room_description_" + i);
			room.put(_descricao, desc.asXml());

		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			room.put(_descricao, "Sem descricao");
		}
	}

	/**
	 * <input type="hidden" value=
	 * "http://cls.cdn-hotels.com/hotels/2000000/1810000/1807800/1807733/1807733_10_t.jpg"
	 * name="hotelImageURL">
	 * 
	 * @param form
	 * @param room
	 */
	private void addInfoRoomImage(HtmlForm form, Map<String, String> room) {
		try {
			room.put(_hotelImageURL, form.getInputByName(_hotelImageURL)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			// e.printStackTrace();
			room.put(_hotelImageURL, "Sem image");
		}
	}

	private void addInfoHotel(Map<String, String> hotel, HtmlForm form) {

		if (hotel.get(_hotelAddress1) == null) {
			addInfoHotelAddress1(hotel, form);
			addInfoHotelAddress2(hotel, form);
			addInfoHotelCity(hotel, form);
			addInfoHotelZip(hotel, form);
			addInfoHotelLatitude(hotel, form);
			addInfoHotelLongitude(hotel, form);
			addInfoHotelQuality(hotel, form);
		}
	}

	/**
	 * <input name="hotelStarRating" type="hidden" value="4.0" />
	 * 
	 * @param hotel
	 * @param form
	 */
	private void addInfoHotelQuality(Map<String, String> hotel, HtmlForm form) {
		try {
			hotel.put(_hotelStarRating, form.getInputByName(_hotelStarRating)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			hotel.put(_hotelStarRating, "0.0");
		}

	}

	/**
	 * <input name="hotelLongitude" type="hidden" value="10.826574" />
	 * 
	 * @param hotel
	 * @param form
	 */
	private void addInfoHotelLongitude(Map<String, String> hotel, HtmlForm form) {
		try {
			hotel.put(_hotelLongitude, form.getInputByName(_hotelLongitude)
					.getValueAttribute());

		} catch (ElementNotFoundException e) {
			hotel.put(_hotelLongitude, "0.0");
		}

	}

	/**
	 * <input name="hotelLatitude" type="hidden" value="46.229732" />
	 * 
	 * @param hotel
	 * @param form
	 */
	private void addInfoHotelLatitude(Map<String, String> hotel, HtmlForm form) {
		try {
			hotel.put(_hotelLatitude, form.getInputByName(_hotelLatitude)
					.getValueAttribute());

		} catch (ElementNotFoundException e) {
			hotel.put(_hotelLatitude, "0.0");
		}

	}

	/**
	 * <input name="hotelPostCode" type="hidden" value="38084" />
	 * 
	 * @param hotel
	 * @param form
	 */
	private void addInfoHotelZip(Map<String, String> hotel, HtmlForm form) {
		try {
			hotel.put(_hotelPostCode, form.getInputByName(_hotelPostCode)
					.getValueAttribute());

		} catch (ElementNotFoundException e) {
			hotel.put(_hotelPostCode, "0");
		}

	}

	/**
	 * <input type="hidden" value="Campinas" name="hotelCity"/>
	 * 
	 * @param hotel
	 * @param form
	 */
	private void addInfoHotelCity(Map<String, String> hotel, HtmlForm form) {
		try {
			hotel.put(_hotelCity, form.getInputByName(_hotelCity)
					.getValueAttribute());

		} catch (ElementNotFoundException e) {
			hotel.put(_hotelCity, "no city");
		}

	}

	/**
	 * <input type="hidden" value="Rua Conceição, 450 - Centro"
	 * name="hotelAddress1"/>
	 * 
	 * @param hotel
	 * @param form
	 */
	private void addInfoHotelAddress1(Map<String, String> hotel, HtmlForm form) {
		try {
			hotel.put(_hotelAddress1, form.getInputByName(_hotelAddress1)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			hotel.put(_hotelAddress1, "no Address");
		}

	}

	/**
	 * <input name="hotelAddress2" type="hidden" value="Madonna di Campiglio" />
	 * 
	 * @param hotel
	 * @param form
	 */
	private void addInfoHotelAddress2(Map<String, String> hotel, HtmlForm form) {
		try {
			hotel.put(_hotelAddress2, form.getInputByName(_hotelAddress2)
					.getValueAttribute());
		} catch (ElementNotFoundException e) {
			hotel.put(_hotelAddress2, "no Address");
		}

	}

	/**
	 * close All Windows
	 */
	private void end() {
		webClient.closeAllWindows();
	}

	/**
	 * Get information from the site and generates InfoHotel
	 * 
	 * @param link
	 * @return InfoHotel
	 */
	public InfoHotel getInfoHotelFromSite(String link) {
		LOGGER.debug("getInfoHotelFromSite");
		Map<String, String> mapHotel = new HashMap<String, String>();
		List<Map<String, String>> listMaproom = null;
		List<String> listImages = null;
		for (int i = 1; i < 5; i++) {
			String lnk = createLink(link, i * 10);
			HtmlPage page = this.pageHotel(lnk);
			listMaproom = this.roomsHotel(mapHotel, page);
			if (listMaproom != null) {
				listImages = this.imagensHotel(page);
				break;
			}
		}
		this.end();
		return new InfoHotel(mapHotel, listMaproom, listImages);
		//
	}

	public class InfoHotel {
		private List<String> listImages;
		private Map<String, String> mapHotel;
		private List<Map<String, String>> listMapRoom;

		private InfoHotel(Map<String, String> mapHotel,
				List<Map<String, String>> listMaproom, List<String> listImages) {
			this.listImages = listImages;
			this.listMapRoom = listMaproom;
			this.mapHotel = mapHotel;
		}

		public List<String> getListImages() {
			return listImages;
		}

		public Map<String, String> getMapHotel() {
			return mapHotel;
		}

		public List<Map<String, String>> getListMapRoom() {
			return listMapRoom;
		}

		@Override
		public String toString() {
			return "InfoHotel [listImages=" + listImages + ", mapHotel="
					+ mapHotel + ", listMapRoom=" + listMapRoom + "]";
		}

	}

}
